﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Bastanteo.Dominio;
using System.Data.SqlClient;

namespace Bastanteo.Persistencia.ADO
{
    public class ClienteDAO : IClienteDAO
    {
        private TipoEmpresaDAO tipoEmpresaDAO = new TipoEmpresaDAO(); // Instancia de otro DAO del cual existe dependencia

        public Cliente Crear(Cliente clienteACrear)
        {
            int nuevoCodigo = ObtenerNuevoCodigo();
            string sentencia = "INSERT INTO t_cliente VALUES (@codigo, @ruc, @razon_social, @inicio_operaciones, @tipo_empresa, @empleados)";
            using (SqlConnection conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    comando.Parameters.Add(new SqlParameter("@codigo", nuevoCodigo));
                    comando.Parameters.Add(new SqlParameter("@ruc", clienteACrear.Ruc));
                    comando.Parameters.Add(new SqlParameter("@razon_social", clienteACrear.RazonSocial));
                    comando.Parameters.Add(new SqlParameter("@inicio_operaciones", clienteACrear.Inicio));
                    comando.Parameters.Add(new SqlParameter("@tipo_empresa", clienteACrear.Tipo.Codigo));
                    comando.Parameters.Add(new SqlParameter("@empleados", clienteACrear.Empleados));
                    comando.ExecuteNonQuery();
                }
            }
            return Obtener(nuevoCodigo);
        }
        public Cliente Obtener(int codigo)
        {
            Cliente clienteExistente = null;
            string sentencia = "SELECT * FROM t_cliente WHERE codigo=@codigo";
            using (SqlConnection conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    SqlDataReader resultado = comando.ExecuteReader();
                    if (resultado.Read())
                    {
                        clienteExistente = new Cliente();
                        clienteExistente.Codigo = (int)resultado["codigo"];
                        clienteExistente.Ruc = (string)resultado["ruc"];
                        clienteExistente.RazonSocial = (string)resultado["razon_social"];
                        clienteExistente.Inicio = (DateTime)resultado["inicio_operaciones"];
                        clienteExistente.Tipo = tipoEmpresaDAO.Obtener((int)resultado["tipo_empresa"]); // Asignación de un objeto
                        clienteExistente.Empleados = (int)resultado["empleados"];
                    }
                }
            }
            return clienteExistente;
        }
        public Cliente Modificar(Cliente clienteAModificar)
        {
            string sentencia = "UPDATE t_cliente SET ruc=@ruc, razon_social=@razon, inicio_operaciones=@inicio, tipo_empresa=@tipo, empleados=@empleados WHERE codigo=@codigo";
            using (SqlConnection conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    comando.Parameters.Add(new SqlParameter("@codigo", clienteAModificar.Codigo));
                    comando.Parameters.Add(new SqlParameter("@ruc", clienteAModificar.Ruc));
                    comando.Parameters.Add(new SqlParameter("@razon", clienteAModificar.RazonSocial));
                    comando.Parameters.Add(new SqlParameter("@inicio", clienteAModificar.Inicio));
                    comando.Parameters.Add(new SqlParameter("@tipo", clienteAModificar.Tipo.Codigo));
                    comando.Parameters.Add(new SqlParameter("@empleados", clienteAModificar.Empleados));
                    comando.ExecuteNonQuery();
                }
            }
            return Obtener(clienteAModificar.Codigo);
        }
        public void Eliminar(Cliente clienteAEliminar)
        {
            string sentencia = "DELETE FROM t_cliente WHERE codigo=@codigo";
            using (SqlConnection conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    comando.Parameters.Add(new SqlParameter("@codigo", clienteAEliminar.Codigo));
                    comando.ExecuteNonQuery();
                }
            }
        }
        public ICollection<Cliente> ListarTodos()
        {
            ICollection<Cliente> clientesExistentes = new List<Cliente>();
            Cliente clienteExistente = null;
            string sentencia = "SELECT * FROM t_cliente";
            using (SqlConnection conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    SqlDataReader resultado = comando.ExecuteReader();
                    while (resultado.Read())
                    {
                        clienteExistente = new Cliente();
                        clienteExistente.Codigo = (int)resultado["codigo"];
                        clienteExistente.Ruc = (string)resultado["ruc"];
                        clienteExistente.RazonSocial = (string)resultado["razon_social"];
                        clienteExistente.Inicio = (DateTime)resultado["inicio_operaciones"];
                        clienteExistente.Tipo = tipoEmpresaDAO.Obtener((int)resultado["tipo_empresa"]); // Asignación de un objeto
                        clienteExistente.Empleados = (int)resultado["empleados"];
                        clientesExistentes.Add(clienteExistente);
                    }
                }
            }
            return clientesExistentes;
        }

        private int ObtenerNuevoCodigo()
        {
            int nuevoCodigo = 0;
            string sentencia = "SELECT max(codigo) FROM t_cliente";
            using (SqlConnection conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    object valor = comando.ExecuteScalar();
                    if (DBNull.Value.Equals(valor))
                        nuevoCodigo = 1;
                    else
                        nuevoCodigo = (int)valor + 1;
                }
            }
            return nuevoCodigo;
        }
    }
}